#include <my_header.h>
#include "queue.h"

#define LENGTH 4096
#define MAX_PATH_LEN 1024
#define STACK_SIZE 100

// 设计线程的结构
typedef struct pool_s{
    // 存储子线程id的数组
    pthread_t *pthread_id;
    // 记录池中有多少个子线程
    int num;

    // 存入任务/客户端连接的队列
    queue_t queue;
    // 维护一个访问共享资源的锁
    pthread_mutex_t pthread_lock;
    // 条件遍历
    pthread_cond_t cond;

    // 退出标记位
    int exit_tag;
}pool_t;

// 枚举类型记录各个命令头
typedef enum{
    cd, ls, ll, pwd, upload, download, mk_dir, rm_dir
}COMMAND;

// 定义栈
typedef struct {
    char paths[STACK_SIZE][MAX_PATH_LEN];
    char init_order[20];
    char init_path[20];
    int top;
} PathStack;

// 初始化子线程
int init_pool(pool_t *p_pool, int num);

// 子线程的入口函数
void * pthread_fun(void *p);

// 初始化socket连接
int init_tcp(int *socket_fd, char *ip, char *port);

// 添加epoll监听
int add_epoll(int epoll_fd, int file_fd);

// 向指定客户端发送文件, client_download
int send_bigfile(PathStack *stack, int socket_fd, char *name);

// 从指定客户端接收文件, client_upload
int recv_bigfile(PathStack *stack, int socket_fd, char *name);

// ls ll 两个命令 
int client_check_order(PathStack *stack, int net_fd, char *order);

// 查看当前路径
int client_pwd(PathStack *stack , int net_fd);

// 新建文件夹
int client_mkdir(PathStack *stack, int net_fd, char *order);

// 删除文件夹/文件
int client_remove(PathStack *stack, int net_fd, char *order);

// 切换路径
int path_cd (PathStack *stack, int net_fd, char *order);

// 登陆检查
void login_check(int net_fd, int *flag_break, char *uname);

// 初始化栈
void initPathStack(PathStack *stack, char *user);

// 入栈
int pathPush(PathStack *stack, const char *path);

// 出栈
int pathPop(PathStack *stack, char *path);

// 访问栈顶元素
int pathPeek(const PathStack *stack, char *path);